/*
 * Configuracion.cpp
 */

#include "Configuracion.h"

bool Configuracion::banderaInstancia = false;

Configuracion* Configuracion::config = NULL;

Configuracion::Configuracion(string path) {
	fstream archivoConfiguracion;
	this->path = path;
	archivoConfiguracion.open(this->path.c_str(), ios::in);

	if (archivoConfiguracion.bad()) {
		archivoConfiguracion.open(this->path.c_str(), ios::in | ios::trunc);
		cout << "Error: No se encuentra el archivo de configuracion";
		string error;
		cin >> error;
	}
	string carpeta;
	string directorio;
	string linea;
	archivoConfiguracion >> linea;
	string comando;
	if (linea == "directorioPrincipal=") {
		archivoConfiguracion >> directorio; //>>endl;
		comando = "mkdir -m 777 -p " + directorio;
		system(comando.c_str());
	}
	archivoConfiguracion >> linea;
	if (linea == "subcarpetaHash=") {
		archivoConfiguracion >> carpeta;
		comando = "mkdir -m 777 -p " + directorio + carpeta;
		this->setPathHashExtensible(directorio + carpeta);
		system(comando.c_str());
	}
	archivoConfiguracion >> linea;
	if (linea == "subcarpetaArbol=") {
		archivoConfiguracion >> carpeta;
		comando = "mkdir -m 777 -p " + directorio + carpeta;
		this->setPathArbol(directorio + carpeta);
		system(comando.c_str());
	}
	archivoConfiguracion >> linea;
	if (linea == "subcarpetaEntidades=") {
		archivoConfiguracion >> carpeta;
		comando = "mkdir -m 777 -p " + directorio + carpeta;
		this->setPathEntidades(directorio + carpeta);
		system(comando.c_str());
	}
	archivoConfiguracion >> linea;
	if (linea == "subcarpetaReportes=") {
		archivoConfiguracion >> carpeta;
		comando = "mkdir -m 777 -p " + directorio + carpeta;
		this->setPathReportes(directorio + carpeta);
		system(comando.c_str());
	}
	archivoConfiguracion >> linea;
	if (linea == "tamanioBloque=") {
		string tamanioBloque;
		archivoConfiguracion >> tamanioBloque;
		this->setTamanioBloque(atoi(tamanioBloque.c_str()));
	}
	archivoConfiguracion >> linea;
	if (linea == "capacidadMaximaNodoHoja=") {
		string capacidadMaximaNodoHoja;
		archivoConfiguracion >> capacidadMaximaNodoHoja;
		this->setCapacidadMaximaNodoHoja(atoi(capacidadMaximaNodoHoja.c_str()));
	}
	archivoConfiguracion >> linea;
	if (linea == "capacidadMaximaNodoInterno=") {
		string capacidadMaximaNodoInterno;
		archivoConfiguracion >> capacidadMaximaNodoInterno;
		this->setCapacidadMaximaNodoInterno(atoi(capacidadMaximaNodoInterno.c_str()));
	}
	archivoConfiguracion >> linea;
	if (linea == "capacidadMinimaNodoHoja=") {
		string capacidadMinimaNodoHoja;
		archivoConfiguracion >> capacidadMinimaNodoHoja;
		this->setCapacidadMinimaNodoHoja(atoi(capacidadMinimaNodoHoja.c_str()));
	}
	archivoConfiguracion >> linea;
	if (linea == "capacidadMinimaNodoInterno=") {
		string capacidadMinimaNodoInterno;
		archivoConfiguracion >> capacidadMinimaNodoInterno;
		this->setCapacidadMinimaNodoInterno(atoi(capacidadMinimaNodoInterno.c_str()));
	}
	archivoConfiguracion >> linea;
	if (linea == "capacidadMaximaCubeta=") {
		string capacidadMaximaCubeta;
		archivoConfiguracion >> capacidadMaximaCubeta;
		this->setCapacidadMaximaCubeta(atoi(capacidadMaximaCubeta.c_str()));
	}
	archivoConfiguracion >> linea;
	if (linea == "nombreArchivoDistrito=") {
		string nombre;
		archivoConfiguracion >> nombre;
		this->setNombreArchivoDistrito(nombre);
	}
	archivoConfiguracion >> linea;
	if (linea == "nombreArchivoCargo=") {
		string nombre;
		archivoConfiguracion >> nombre;
		this->setNombreArchivoCargo(nombre);
	}
	archivoConfiguracion >> linea;
	if (linea == "nombreArchivoCandidato=") {
		string nombre;
		archivoConfiguracion >> nombre;
		this->setNombreArchivoCandidato(nombre);
	}
	archivoConfiguracion >> linea;
	if (linea == "nombreArchivoConteo=") {
		string nombre;
		archivoConfiguracion >> nombre;
		this->setNombreArchivoConteo(nombre);
	}
	archivoConfiguracion >> linea;
	if (linea == "nombreArchivoLista=") {
		string nombre;
		archivoConfiguracion >> nombre;
		this->setNombreArchivoLista(nombre);
	}
	archivoConfiguracion >> linea;
	if (linea == "nombreArchivoVotante=") {
		string nombre;
		archivoConfiguracion >> nombre;
		this->setNombreArchivoVotante(nombre);
	}
	archivoConfiguracion >> linea;
	if (linea == "nombreArchivoEleccion=") {
		string nombre;
		archivoConfiguracion >> nombre;
		this->setNombreArchivoEleccion(nombre);
	}
	archivoConfiguracion >> linea;
	if (linea == "nombreArchivoAdministrador=") {
		string nombre;
		archivoConfiguracion >> nombre;
		this->setNombreArchivoAdministrador(nombre);
	}

	archivoConfiguracion >> linea;
	if (linea == "nombreArchivoLog=") {
		string nombre;
		archivoConfiguracion >> nombre;
		this->setNombreArchivoLog(nombre);
	}
	archivoConfiguracion.close();
}

Configuracion* Configuracion::getInstancia(string path) {
	if (!banderaInstancia) {
		config = new Configuracion(path);
		banderaInstancia = true;
		return config;
	} else {
		return config;
	}
}

Configuracion* Configuracion::getInstancia() {
	if (!banderaInstancia) {
		config = new Configuracion("archivoConfiguracion.txt");
		banderaInstancia = true;
		return config;
	} else {
		return config;
	}
}
string Configuracion::getPathEntidades() const {
	return this->pathEntidades;
}
string Configuracion::getPathHashExtensible() const {
	return this->pathHashExtensible;
}

int Configuracion::getTamanioBloque() const {
	return this->tamanioDelBloque;
}

string Configuracion::getPathReportes() const {
	return this->pathReportes;
}

int Configuracion::getCapacidadMaximaNodoHoja() {
	return this->capacidadMaximaNodoHoja;
}

int Configuracion::getCapacidadMinimaNodoHoja() {
	return this->capacidadMinimaNodoHoja;
}

int Configuracion::getCapacidadMaximaNodoInterno() {
	return this->capacidadMaximaNodoInterno;
}

int Configuracion::getCapacidadMinimaNodoInterno() {
	return this->capacidadMinimaNodoInterno;
}

int Configuracion::getCapacidadMaximaCubeta() {
	return this->capacidadMaximaCubeta;
}

void Configuracion::setTamanioBloque(int tamanioBloque) {
	this->tamanioDelBloque = tamanioBloque;
}

void Configuracion::setPathReportes(string reportsFilesPath) {
	this->pathReportes = reportsFilesPath;
}

string Configuracion::getPathArbol() const {
	return this->pathArbol;
}

void Configuracion::setPathHashExtensible(string pathHash) {
	this->pathHashExtensible = pathHash;
}

void Configuracion::setPathArbol(string pathArbol) {
	this->pathArbol = pathArbol;
}

void Configuracion::setPathEntidades(string pathEntidades) {
	this->pathEntidades = pathEntidades;
}

void Configuracion::setCapacidadMaximaNodoHoja(int capacidadMaximaNodoHoja) {
	this->capacidadMaximaNodoHoja = capacidadMaximaNodoHoja;
}

void Configuracion::setCapacidadMinimaNodoHoja(int capacidadMinimaNodoHoja) {
	this->capacidadMinimaNodoHoja = capacidadMinimaNodoHoja;
}

void Configuracion::setCapacidadMaximaNodoInterno(int capacidadMaximaNodoInterno) {
	this->capacidadMaximaNodoInterno = capacidadMaximaNodoInterno;
}

void Configuracion::setCapacidadMinimaNodoInterno(int capacidadMinimaNodoInterno) {
	this->capacidadMinimaNodoInterno = capacidadMinimaNodoInterno;
}

void Configuracion::setCapacidadMaximaCubeta(int capacidadMaximaCubeta) {
	this->capacidadMaximaCubeta = capacidadMaximaCubeta;
}
void Configuracion::error() {

}

string Configuracion::getNombreArchivoAdministrador() const {
	return nombreArchivoAdministrador;
}

string Configuracion::getNombreArchivoCandidato() const {
	return nombreArchivoCandidato;
}

string Configuracion::getNombreArchivoCargo() const {
	return nombreArchivoCargo;
}

string Configuracion::getNombreArchivoConteo() const {
	return nombreArchivoConteo;
}

string Configuracion::getNombreArchivoDistrito() const {
	return nombreArchivoDistrito;
}

string Configuracion::getNombreArchivoEleccion() const {
	return nombreArchivoEleccion;
}

string Configuracion::getNombreArchivoLista() const {
	return nombreArchivoLista;
}

string Configuracion::getNombreArchivoVotante() const {
	return nombreArchivoVotante;
}

string Configuracion::getNombreArchivoLog() const {
	return nombreArchivoLog;
}

int Configuracion::getTamanioDelBloque() const {
	return tamanioDelBloque;
}

void Configuracion::setNombreArchivoAdministrador(string nombreArchivoAdministrador) {
	this->nombreArchivoAdministrador = nombreArchivoAdministrador;
}

void Configuracion::setNombreArchivoCandidato(string nombreArchivoCandidato) {
	this->nombreArchivoCandidato = nombreArchivoCandidato;
}

void Configuracion::setNombreArchivoLog(string nombreArchivoLog) {
	this->nombreArchivoLog = nombreArchivoLog;
}

void Configuracion::setNombreArchivoCargo(string nombreArchivoCargo) {
	this->nombreArchivoCargo = nombreArchivoCargo;
}

void Configuracion::setNombreArchivoConteo(string nombreArchivoConteo) {
	this->nombreArchivoConteo = nombreArchivoConteo;
}

void Configuracion::setNombreArchivoDistrito(string nombreArchivoDistrito) {
	this->nombreArchivoDistrito = nombreArchivoDistrito;
}

void Configuracion::setNombreArchivoEleccion(string nombreArchivoEleccion) {
	this->nombreArchivoEleccion = nombreArchivoEleccion;
}

void Configuracion::setNombreArchivoLista(string nombreArchivoLista) {
	this->nombreArchivoLista = nombreArchivoLista;
}

void Configuracion::setNombreArchivoVotante(string nombreArchivoVotante) {
	this->nombreArchivoVotante = nombreArchivoVotante;
}

void Configuracion::setTamanioDelBloque(int tamanioDelBloque) {
	this->tamanioDelBloque = tamanioDelBloque;
}

Configuracion::~Configuracion() {
	this->banderaInstancia = false;
}
